package sucre
 
import ve.org.src.sesiones.SesionBean
import ve.org.src.sesiones.ManejadorSesiones

class SeguridadController {
    
    def loginService
    def beforeInterceptor = [action:this.&auth]
    def auth = {
        println "verificar accion...."
        
        def result =loginService.validarAcceso(
            session["seguridad_usuario"],
            session["seguridad_funcionesHabilitadas"],
            controllerName,actionName,request.getRemoteAddr().toString())
        println "result: " + result
        if(!result) {
            redirect(controller:"login",action:"auth",params:['acceso':false])
            return false
        }
    }

    def listarDirectivas={
        def directivas=DirectivaPassword.createCriteria().list{}
        if(session.seguridad_directivas_temp!=null){
            session.removeValue('seguridad_directivas_temp')
        }
        session.seguridad_directivas_temp=[:]
        directivas.each{
            
            session.seguridad_directivas_temp.put(it.id,it)
        }        
        return[directivas:directivas]
    }
    def actualizarDirectivas={
        def msg='Actualizado'        
        if(params.directiva_id!=null &&params.directiva_id.size()>0 && session.seguridad_directivas_temp!=null && session.seguridad_directivas_temp.size()>0){
            DirectivaPassword.withTransaction{status->
                try{
                    int posicion=0
                    params.directiva_id.each{directiva->
                        def dir=session.seguridad_directivas_temp.get(new Long(directiva))
                        def activa=false
                        params.dir_estado.each{estado->
                            if(new Long(estado)==dir.id){
                                activa=true
                            }
                        }
                        dir.activa=activa
                        if(dir.editable){                                                        
                            dir.valor=params.dir_value[posicion]
                        }                        
                        dir.save()
                        posicion++
                    }
                }catch(Exception e){
                    status.setRollbackonly()
                    println e
                    msg='Ocurrio un error actualizando'
                }
            }
        }else{
            msg='Ocurrio un error actualizando [parametros]'
        }
        /*if(session.seguridad_directivas_temp!=null){
            session.removeValue('seguridad_directivas_temp')
        }*/
        render(msg)
    }

    def listarSesionesActivas={
        def listaSesiones=[]
        listaSesiones=ManejadorSesiones.listarSesionesActivas()
        // listaSesiones=mapaSession
        return[listaSesiones:listaSesiones]
    }
    def actualizarSesiones={
        // println "params "+params
        if(params.lista_id!=null){
            ManejadorSesiones.caducarSesion(params.lista_id)
        }
        redirect(action:"listarSesionesActivas",controller:"seguridad")
    }

    def funcionesHabilitadas={
        println '-----------------------------------------'
        def CTRLs=grailsApplication.controllerClasses

        def listaFunciones=[]
        def filtroControllers=['Jasper':1,'FontImage':1]
        CTRLs.each{c->
            if(filtroControllers.get(c.name)==null){
                println c.name
                def uris=c.getURIs()
                uris.each{s->
                    if(!s.endsWith('*') && !s.endsWith('/') && !s.endsWith('/*')&& !s.endsWith('/**') && !s.endsWith(']')&&s.lastIndexOf('/')>c.name.length()){
                        String accion=s.substring(c.name.length()+2,s.length())
                        String controlador=c.name.substring(0,1).toLowerCase()+c.name.substring(1,c.name.length())
                        println '\t'+accion
                        listaFunciones.add([controlador:controlador,accion:accion])
                    }
                }
                filtroControllers.put(c.name,1)
            }
        }
        def lista1=AccionMenuFuncion.list()        
        def mapa1=[:]

        lista1.each{funcion->
            mapa1.put(funcion.controlador+funcion.accion,1)
        }

        println 'Funciones/AccionMenu '+lista1.size()
        int cc=0
        listaFunciones.each{funcion->
            if(mapa1.get(funcion.controlador+funcion.accion)==null){
                def accion=new AccionMenuFuncion()
                accion.controlador=funcion.controlador
                accion.accion=funcion.accion
                accion.habilitada=true
                accion.save()
                cc++
            }
        }
        println 'Funciones actualizadas: '+cc+'/'+listaFunciones.size()

    }

}
